package server

import (
	"bufio"
	"fmt"
	"net"

	"gb28181/internal/config"
	"gb28181/internal/manager"
	"gb28181/internal/protocol"

	"github.com/zeromicro/go-zero/core/logx"
)

// GB28181TCPServer TCP服务器实现
type GB28181TCPServer struct {
	config    *config.Config
	clientMgr *manager.ClientManager
	listener  net.Listener
	logger    logx.Logger
}

// NewGB28181TCPServer 创建TCP服务器
func NewGB28181TCPServer(cfg *config.Config, mgr *manager.ClientManager) *GB28181TCPServer {
	return &GB28181TCPServer{
		config:    cfg,
		clientMgr: mgr,
		logger:    logx.WithCallerSkip(1),
	}
}

// Start 启动TCP服务器
func (s *GB28181TCPServer) Start(port int) error {
	addr := fmt.Sprintf(":%d", port)
	listener, err := net.Listen("tcp", addr)
	if err != nil {
		return fmt.Errorf("启动TCP服务器失败: %v", err)
	}
	s.listener = listener

	s.logger.Infof("GB28181 TCP服务器启动成功，监听端口: %d", port)

	for {
		conn, err := listener.Accept()
		if err != nil {
			s.logger.Errorf("接受连接失败: %v", err)
			continue
		}

		go s.handleConnection(conn)
	}
}

// handleConnection 处理客户端连接
func (s *GB28181TCPServer) handleConnection(conn net.Conn) {
	defer conn.Close()

	clientAddr := conn.RemoteAddr().String()
	s.logger.Infof("客户端连接: %s", clientAddr)

	reader := bufio.NewReader(conn)
	writer := bufio.NewWriter(conn)

	for {
		// 读取消息
		message, err := reader.ReadString('\n')
		if err != nil {
			s.logger.Debugf("客户端断开连接: %s", clientAddr)
			break
		}

		// 处理GB28181协议消息
		response := s.handleGB28181Message(message)

		// 发送响应
		_, err = writer.WriteString(response + "\n")
		if err != nil {
			s.logger.Errorf("发送响应失败: %v", err)
			break
		}
		writer.Flush()
	}
}

// handleGB28181Message 处理GB28181协议消息（支持SIP格式）
func (s *GB28181TCPServer) handleGB28181Message(message string) string {
	// 创建消息处理器
	handler := protocol.NewMessageHandler(s.clientMgr)

	// 解析消息
	msg, err := protocol.ParseMessage([]byte(message))
	if err != nil {
		s.logger.Errorf("消息解析失败: %v", err)
		return fmt.Sprintf("ERROR:消息解析失败 - %v", err)
	}

	// 处理消息
	response, err := handler.HandleMessage(msg)
	if err != nil {
		s.logger.Errorf("消息处理失败: %v", err)
		return fmt.Sprintf("ERROR:消息处理失败 - %v", err)
	}

	// 检查是否是SIP消息，如果是则构建SIP格式响应
	useSIPFormat := protocol.IsSIPMessage([]byte(message))
	var sipFrom, sipTo, sipCallID string

	if useSIPFormat {
		// 解析原始消息获取SIP头部信息
		sipMsg, parseErr := protocol.ParseSIPMessage([]byte(message))
		if parseErr == nil {
			sipFrom = sipMsg.From
			sipTo = sipMsg.To
			sipCallID = sipMsg.CallID
		}
	}

	// 构建响应
	responseData, err := protocol.BuildResponse(
		response.CmdType,
		response.SN,
		response.DeviceID,
		response.Result,
		response.Status,
		response.Info,
		useSIPFormat,
		sipFrom,
		sipTo,
		sipCallID,
	)
	if err != nil {
		s.logger.Errorf("响应构建失败: %v", err)
		return fmt.Sprintf("ERROR:响应构建失败 - %v", err)
	}

	return string(responseData)
}

// Stop 停止服务器
func (s *GB28181TCPServer) Stop() {
	if s.listener != nil {
		s.listener.Close()
		s.logger.Info("GB28181 TCP服务器已停止")
	}
}
